1
有状态进程与尾调用优化
AI019Lesson 7
00:00

在 Elixir 中,进程默认是短暂的;一旦函数执行完毕,进程就会终止。要创建一个 持久化、有状态的进程,我们需要使用递归来使进程在循环中保持活跃。

1. 尾调用优化(TCO)

如果一个函数的绝对最后操作是调用自身,Erlang 虚拟机(BEAM)将执行 尾调用优化。它不会向栈中添加新的帧,而是直接 跳回到函数的起始位置 并使用新参数重新开始执行。

def factorial(n, acc), do: _fact(n-1, acc*n) # TCO
def factorial(n), do: n * factorial(n-1) # 非 TCO
greet() 逻辑greet() 调用TCO:重用栈帧

2. 持久化状态

状态通过将更新后的值作为参数传递给递归调用进行维护。由于尾调用优化,这些参数会替换栈上的原始参数,而无需额外内存开销,从而允许循环无限运行。

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>